package outline;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;

//이벤트 처리하기
//스윙은 이벤트 중심 event-driven 임
//컴퍼넌트는 이벤트를 발생할 수 있고
//개발자는 이것을 처리하는 코드를 작성해야 함
//이벤트 중심 패러다임은 스윙뿐만 아니라
//모든 gui 프로그램에 적용되는
//사용자 상화작용의 근간(뿌리,핵심)임
//스윙의 이벤트 처리방식을 알아보기 전에
//먼저 자바의 이벤트 처리 방식을 알아봄


//자바 이벤트 처리 모델
//자바에서 모든 객체는 자신의 상태state변화를
//다른 객체에게 알릴 수 있음
//event-driven 프로그래밍에서
//이벤트 event 는 객체의 상태 변화를 의미함
//이 모델에는 3가지 참여자가 존재
//*이벤트 source : 상태가 변경된 객체
//*이벤트 object : 이벤트 소스의 상태 변경을 캡슐화 한것
//*이벤트 listener : 이벤트 소스의 상태변경을 통지하고 싶어하는 객체
//간단히 정리하면 , 이벤트가 발생하면 이벤트 소스는 이벤트 객체를 만들어서
//이벤트 리스너에게 보냄

//이벤트소스
//모든객체는 이벤트소스가 될수있음
//이벤트 소스클래스는 이벤트리스너가
//관심있어하는 이벤트를 받으면
//그것을 등록하거나 제거할수있는 메서드를
//제공해야함
//예를 들어 ,JMenuItem이 클릭되면 java.awt.ActionEvent를 발생함
//따라서 JMenuItem에는 addActionlostener와 removeActionListener메서드를 제공함

//이벤트 객체
//이벤트 객체는 변경전 값과 변경후 새로운 값 등의 이벤트의 특정유형에 대한 정보들이 캡슐화 되어 있음
//모든 이벤트 소스에는 이것을 반환하는 getSource 메서드를 가지고 있음

//이벤트 리스너
//특정 유형의 이벤트를 처리하기 위해
//반드시 구현해야 하는 인터페이스를 의미
//모든 리스너 인터페이스는 java.util.eventlostener의 하위 인터페이스임

//이벤트 리스너 인터페이스는 반드시 해당 이벤트 객체를 받을 수 있는 메서드가 정의되어야 함
//actionPerformed(ActionEvent e)

//스윙에서 이벤트를 처리하려면
//단지 이벤트 리스너를 작성해야함
//왜냐하면 , 스윙의 기본 이벤트 처리시
//이벤트 소스와 이벤트 객체를 미리 작업해 줌

//스윙에서 다뤄야 하는 이벤트 종류
/*
 * ActionEvent - ActionListener -> JMenuItem,JButton 등의 버튼들
 * KeyEvent - KeyListener -> 거의 대부분의 스윙 컴퍼넌트들
 * MouseEvent - MouseListener -> 거의 대부분의 스윙 컴퍼넌트들
 * WindowEvent - WindowListener -> JFrame,JDialog 등의 컨테이너
 * 
 */

public class J07_HelloSwingEvent extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					J07_HelloSwingEvent frame = new J07_HelloSwingEvent();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public J07_HelloSwingEvent() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		
		//메뉴 이벤트 처리기 클래스를 등록
		J07_HelloSwingActionListener ha = new J07_HelloSwingActionListener();
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnNewMenu = new JMenu("File (F)");
		menuBar.add(mnNewMenu);
		
		JMenuItem mntmNewMenuItem = new JMenuItem("New (N)");
		mntmNewMenuItem.addActionListener(ha);
		mntmNewMenuItem.setActionCommand("new");
		mnNewMenu.add(mntmNewMenuItem);
		
		JSeparator separator = new JSeparator();
		mnNewMenu.add(separator);
		
		JMenuItem mntmNewMenuItem_1 = new JMenuItem("Close (C)");
		mntmNewMenuItem_1.addActionListener(ha);
		mntmNewMenuItem_1.setActionCommand("close");
		mnNewMenu.add(mntmNewMenuItem_1);
		
		JSeparator separator_1 = new JSeparator();
		mnNewMenu.add(separator_1);
		
		JMenuItem mntmNewMenuItem_2 = new JMenuItem("Exit (x)");
		mntmNewMenuItem_2.addActionListener(ha);
		mntmNewMenuItem_2.setActionCommand("exit");
		mnNewMenu.add(mntmNewMenuItem_2);
		
		JMenu mnNewMenu_1 = new JMenu("Edit (E)");
		menuBar.add(mnNewMenu_1);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
	}

}
